#include <stdio.h>
#include <stdlib.h>

// 设计算法在有序单链表中删除重复元素e, 使得单链表删除e后依旧有序
typedef struct LNode
{
    LNode * next;
    int data; 
}LNode,*LinkList;

// 输出链表
void Print(LinkList L){
    if(!L)
        return;
    LNode * p = L->next;
    while(p != NULL)
    {
        printf("%d",p->data);
        p = p->next;
    }
}

// 返回链表中值为e的结点
LNode* GetNode(LinkList L, int e){
    if(!L)
        return NULL;
    LNode * p = L->next;
    while(p != NULL)
    {
        if (p->data == e)
            return p;
        p = p->next;
    }
    return NULL;
}

// 返回链表中值为e的前驱结点
LNode* GetPreNode(LinkList L, int e) {
    if(!L)
        return NULL;
    LNode * p = L;
    while(p->next != NULL)
    {
        if (p->next->data == e)
            return p;
        p = p->next;
    }
    return NULL;
}

// 删除链表中所有值为e的结点
void DelNode(LinkList &L, int e) {
    if(!L)
        return;
    LNode * p = L;
    while(p->next != NULL)
    {
        if (p->next->data == e) {
            LNode *q = p->next;
            p->next = q->next;
            free(q);
        } else {
            p = p->next;
        }
    }
}

// 1 2 2 2 2 2 3...(10000000)

void DelElem_L(LinkList &L,int e){
    if(!L)
        return;
    LNode * p = L;
    while(p->next != NULL && (p->next->data <= e))
    {
        if (p->next->data == e) {
            LNode *q = p->next;
            p->next = q->next;
            free(q);
        } else {
            p = p->next;
        }
    }
}

// 返回链表中间位置的结点
LNode* GetMidNode(LinkList L){
    if(!L)
        return NULL;
    LNode * p = L->next;
    LNode * q = p;
    while(p->next != NULL && p->next->next != NULL)
    {
        q = q->next->next;
        p = p->next;
    }
    return p;
}

int main(){
    return 0;
}